package com.sytc.camera.improttample;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.stage.Stage;

import java.util.*;

public class DragAndDropWithCheckBox extends Application {



    CheckBox cbox0 = new CheckBox("0");  // 编码0
    CheckBox cbox1 = new CheckBox("1");  // 编码1
    CheckBox cbox2 = new CheckBox("2");  // 编码2
    CheckBox cbox3 = new CheckBox("3");  // 编码3
    CheckBox cbox4 = new CheckBox("4"); // 编码4



    Map<Integer, Integer> cMap = new HashMap();
    {
        cMap.put(cbox0.hashCode(), 0);
        cMap.put(cbox1.hashCode(), 1);
        cMap.put(cbox2.hashCode(), 2);
        cMap.put(cbox3.hashCode(), 3);
        cMap.put(cbox4.hashCode(), 4);
    }

    @Override
    public void start(Stage primaryStage) {
        // 创建一个ObservableList，作为ListView的数据源
        ObservableList<CheckBox> items = FXCollections.observableArrayList(
               cbox0,
                cbox1,
                cbox2,
                cbox3,
                cbox4
        );
        

        // 创建一个ListView，并设置数据源
        ListView<CheckBox> listView = new ListView<>(items);
        listView.setPrefSize(300, 200);
        

        // 触发拖放开始事件
        listView.setOnDragDetected(event -> {
            System.out.println("onDragDetected");
            // onDragDetected(listView);
            CheckBox selectedItem = listView.getSelectionModel().getSelectedItem();
            if (selectedItem != null) {
                // 这一句是说，拖动的由listView发起的，后边可以通过dragboard获取到listView对象
                Dragboard dragboard = listView.startDragAndDrop(TransferMode.MOVE);
                // 这一句决定了拖动的是啥(本质是系统的复制黏贴板里放啥，如果啥也不放，那就相当于没有拖动，所以这一句必须有，里边放啥都行，必须放)，可以拖动文字，图像，文件等，checkbox是无法拖动的，
                // 这里放的所在list的索引，后边可以进行删除和添加操作
                dragboard.setContent(Collections.singletonMap(DataFormat.PLAIN_TEXT, listView.getSelectionModel().getSelectedIndex()+""));
            }
            event.consume();
        });

        // 路过其它控件时，鼠标的样式
        listView.setOnDragOver(event -> {
            System.out.println("onDragOver");
            if (event.getGestureSource() instanceof ListView) {
                event.acceptTransferModes(TransferMode.MOVE);
            }
            event.consume();
        });

        // 拖放结束，相当于在可放置位置，松开鼠标
        listView.setOnDragDropped(event -> {
            System.out.println("onDragDropped");
            // 获取被拖放的元素
            Dragboard dragboard = event.getDragboard();
            if (dragboard.hasString()) {

                Node targetNode = (Node) event.getTarget();
                // 判断目标节点是否为ListCell
                if (targetNode instanceof ListCell) {


                    ListCell<CheckBox> targetCell = (ListCell<CheckBox>) targetNode;
                    CheckBox targetItem = targetCell.getItem(); // 获取目标项
                    int targetIndex = listView.getItems().indexOf(targetItem); // 获取目标项的索引

                    if(targetIndex == -1){
                        targetIndex = items.size() - 1;
                    }
                    int index = Integer.valueOf(dragboard.getString());
                    CheckBox sour = items.get(index);
                    items.remove(index);
                    items.add(targetIndex, sour);
                    // 更新列表顺序
                }
                event.setDropCompleted(true);

            }
            event.consume();
        });


        // 获取所有选中的Item的编码,按排列顺序输出
        listView.setOnMouseReleased(event -> {
            List<Integer> selectedIds = new ArrayList<>();
            for (CheckBox item : listView.getItems()) {
                if (item.isSelected()) {
                    selectedIds.add(cMap.get(item.hashCode()));
                }
            }
            // 输出选中项的编码
            System.out.println("Selected IDs: " + selectedIds);
        });

        // 创建场景并显示
        Scene scene = new Scene(listView);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Drag and Drop ListView with CheckBox");
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}